#include "head.h"

int InitTcpServer( const char *strServerIp, const int ServerPort )
{
    int ServerSockFd;
    ServerSockFd = socket( AF_INET, SOCK_STREAM, 0 );
    if ( -1 == ServerSockFd )
    {
        perror( "fail socket" );
        return -1;
    }

    struct sockaddr_in ServerAddr;
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_port = htons( ServerPort );
    ServerAddr.sin_addr.s_addr = inet_addr( strServerIp );
    
    int Ret;
    Ret = bind( ServerSockFd, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr) );
    if ( -1 == Ret )
    {
        perror( "fail bind" );
        return -1;
    }

    Ret = listen( ServerSockFd, 50 );
    if ( -1 == Ret )
    {
        perror( "fail listen" );
        return -1;
    }

    return ServerSockFd;
}

/*
程序功能
    建立 TCP并发服务器, 
    每接收到一个客户端的 TCP连接请求, 则创建一个子进程与客户端建立 TCP连接
    在 TCP连接 中, 完成与客户端的聊天交互

涉及函数
    socket()
    bind()
        struct sockaddr_in
        htons()
        inet_addr()
    listen()
    accept()
    recv()
    close()

    signal()
    fork()
    wait()

程序流程框架

    main函数
        等待子进程信号 ( signal )
        创建 TCP服务器套接字 ( socket, bind, listen)
        while (1)
            等待客户端连接, 建立通信套接字 ( accept )
            创建子进程
            在父进程中
                空操作 (实际为等待子进程信号 )
            在子进程中
                进行循环通信交互 (循环结束条件: 客户端关闭)
                    接收来自客户端的TCP数据
                    响应客户端
                关闭通信套接字
        关闭 TCP服务器套接字

    signal处理回调函数
        回收子进程 ( wait )
    

知识要点
测试流程
*/